#include "structure.h"
#include "dispatcher.h"
#include "mapping.h"
#include "response.h"
#include "fileManager.h"
#include "utils.h"
#include "fileManager.h"
#include "utils.h"

#define BUFF_SIZE 1024

void* threadMain(void *ptr){
    pool_t *pool = (pool_t*)ptr;
    printf("线程，启动！\n");

    
    while(1){
        pthread_mutex_lock(&pool->lock);
        
        // 退出标记为为1就不用wait了
        while(pool->queue.size <= 0 && pool->exitFlag == 0){
            // 取消点
            // 子线程有可能带锁死亡，别的线程就亖不了的
            pthread_cond_wait(&pool->cond, &pool->lock);
        }

        if(pool->exitFlag == 1){
            // 子线程退出
            pthread_mutex_unlock(&pool->lock);
            pthread_exit(NULL);
        }

        int net_fd = pool->queue.head->net_fd;

        deQueue(&pool->queue);
        pthread_mutex_unlock(&pool->lock);

        printf("有一个客户端到来\n");
        // 帧长度
        unsigned int frameLength;

        // 命令
        unsigned short command;

        // 参数
        char parameter[BUFF_SIZE];

        while(1){
            // TODO 接收请求
            memset(parameter, 0, BUFF_SIZE);
            int flag = dispatcher(net_fd, &frameLength, &command, parameter);
            
            // 客户端断开连接则跳出循环
            if(flag == 0){
                break;
            }

            // TODO 根据命令处理请求
            // printf("sonThread.c threadMain  parameter : %s\n",parameter);
            int ret = handleMapping(command, parameter);

            // 先发送成功还是失败，再根据命令，接口文档发送内容
            if(ret == 0){
                sendError(net_fd);
            }else{
                sendSuccess(net_fd);

                // TODO 根据命令发送响应
                response(net_fd, command, parameter);
            }
        }
        close(net_fd);
        printf("客户端断开连接\n");

    }

    return (void*)0;
}
